1Há duas principais maneiras de chegar a esse ambiente de programação:
Localmente: é preciso instalar o Python e uma IDE no seu computador.
Na nuvem: acessa pelo navegador um ambiente já pronto e configurado para rodar Python.
Um ambiente na nuvem pode ser o Jupyter Notebook/Google Colab e um ambiente local pode ser o VsCode ou Anaconda, mas a opção aqui é o Quarto do RStudio.
Jupyter Notebook/Google Colab
O Jupyter Notebook é uma interface para programar em uma estrutura de “caderno de anotação”: você pode escrever textos, inserir imagens, etc. e adicionar blocos de código, assim como exibir os resultados do código, tudo em um mesmo arquivo. Suas principais vantagens se referem a interface simples e intuitiva para iniciantes, além da facilidade de compartilhar códigos.
Para usar a interface do Jupyter na nuvem, basta seguir estes passos:
Clicar em Novo (New) > Mais (More) > Google Colaboratory.
E com isso já se tem um ambiente de programação em Python.
O que estes procedimentos fazem é criar um arquivo “Untitled0.ipynb” no seu Google Drive. Dessa forma, você pode escolher onde criar o arquivo e organizar seus códigos em pastas, se preferir.
O ponto forte está na sua capacidade de fácil integração (Google Drive, Github, entre outros), além de não ser necessário ter instalado a linguagem na máquina.
Para acessar, basta ir no site https://colab.research.google.com/, ter uma conta Google e criar um novo notebook.
A outra possibilidade é ir no site do Python (https://www.python.org/), fazer download do arquivo e depois ir no terminal do Mac/OS ou no Prompt do Windows e instalar o Jupiter (python3 -m pip install jupyter). Depois de instalado, no termina/prompt é digitar python3 -m notebook para abrir um Jupyter no navegador e usar em uma interface muito parecida com a do Google Colab.
Quarto
O uso no Quarto se torna mais tranquilo para quem já usa o RStudio e trabalha tanto com o R quanto o Python. Para inserir os códigos a única diferença é que os chunks passam agora a iniciar com {python} ao invés de {r} depois das três crases.
E ainda existe a possibilidade de rodar Python dentro do R, desde que seja usado o pacote reticulate.
Um bom post sobre como preparar o ambiente de trabalho deve ser lido nesta página (https://analisemacro.com.br/data-science/python/introducao-ao-python-como-preparar-o-ambiente-de-trabalho/).
Para importar um arquivo CSV offline pode-se usar a biblioteca pandas no Python:
# Importa o arquivo "dados.csv" salvo na pasta "dados" a partir da pasta atualimport pandas as pdtabela = pd.read_csv(filepath_or_buffer ="dados/dados.csv")
A função read_csv() importa o arquivo para um objeto DataFrame no Python, basta apontar a localização.
Por padrão, a função tenta adivinhar os tipos das colunas e utiliza a primeira linha como nome das colunas da tabela.
Importando CSV com ponto e vírgula (;) de separador
O padrão de arquivos CSV é usar a vírgula como separador dos valores, mas em alguns casos o arquivo CSV pode ter sido gerado com um separador diferente.
No caso de separador ponto e vírgula (;) em um arquivo CSV, o padrão é que os decimais sejam, então, uma vírgula. Para importar nesse formato use os argumentos da função read_csv():
O padrão do pacote pandas é utilizar a mesma codificação de caracteres de fábrica do Python, que é a UTF-8. Se o arquivo CSV foi gerado com outra codificação pode ser que a importação dos dados saia do resultado desejado. O principal problema que pode acontecer é caracteres especiais, como “ç”, não serem reconhecidos ou a importação gerar um erro. Por exemplo (dados do TSE):
# Importa arquivo CSV com separador ; e encoding padrão (gera um erro)tse_codificacao_eua = pd.read_csv( filepath_or_buffer ="dados/tse.csv", sep =";" )
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 in position 398: invalid continuation byte
Para lidar com esses problemas deve-se apontar uma codificação compatível com o arquivo no momento da importação. Basta informar no argumento encoding qual é a codificação correta:
# Importa arquivo CSV com separador ; e encoding latin1tse_codificacao_br = pd.read_csv( filepath_or_buffer ="dados/tse.csv", sep =";", encoding ="latin_1" )tse_codificacao_br.iloc[range(3), range(6)]
Dados do IPEADATA - utilizando a biblioteca ipeadatapy
Dados do Sidra/IBGE - - utilizando a biblioteca sidrapy
Com uma série no Banco Central:
# Coletar dados da SELIC no SGS/BCBfrom bcb import sgs # nome da biblioteca é "bcb"import seaborn as sns # para fazer o gráfiodados_sgs = sgs.get(codes =432, start ="2020-01-01")dados_sgs
Passo 2: preencha na tela os filtros para a consulta de dados (veja essa página de ajuda);
Passo 3: selecione o formato de saída text/csv e clique em Copiar URL.
Passo 4: utilize a biblioteca pandas para importar os dados.
# Coleta de dados de Expectativas de Mercado para Câmbio - final do anoimport pandas as pddados_focus = pd.read_csv( filepath_or_buffer ="https://olinda.bcb.gov.br/olinda/servico/Expectativas/versao/v1/odata/ExpectativasMercadoAnuais?$top=100&$filter=Indicador%20eq%20'C%C3%A2mbio'%20and%20Data%20ge%20'2024-01-01'%20and%20DataReferencia%20eq%20'2024'%20and%20baseCalculo%20gt%200&$format=text/csv&$select=Indicador,Data,DataReferencia,Media,baseCalculo", decimal =",", sep =",", encoding ="utf-8")#Tipos de Encondings#encoding=’latin1′#encoding=’ISO-8859-1′#encoding=’utf-8′#encoding=’cp1252′dados_focus.tail()
Em relação aos dados do IPEADATA, suponha que o objetivo seja coletar a série do saldo do Novo CAGED.
Passo 1: utilize a função list_series() para localizar a série desejada e obter o código da mesma (retorna um DataFrame);
# Extrair tabela com todas séries e códigos disponíveisimport ipeadatapy as ipeaimport matplotlib.pyplot as pltimport seaborn as sns#Maneira usando Metadadosipea.metadata()
# Outra formaseries_ipeadata = ipea.list_series()ipea.list_series('Caged')
CODE NAME
6906 ADMISNC Empregados - admissões - Novo Caged
6908 CAGED12_ADMISN12 Empregados - admissões - sem ajuste - novo Caged
6909 CAGED12_ADMISNAJU12 Empregados - admissões - com ajuste - novo Caged
6911 CAGED12_DESLIGN12 Empregados - demissões - sem ajuste - novo Caged
6912 CAGED12_DESLIGNAJU12 Empregados - demissões - com ajuste - novo Caged
6914 CAGED12_SALDON12 Empregados - saldo - sem ajuste - novo Caged
6915 CAGED12_SALDONAJU12 Empregados - saldo - com ajuste - novo Caged
6921 DESLIGNC Empregados - demissões - Novo Caged
# Filtrar séries com o termo "CAGED"series_ipeadata[series_ipeadata.CODE.str.contains("CAGED")]
CODE NAME
6907 CAGED12_ADMIS Empregados - admissões - INATIVA
6908 CAGED12_ADMISN12 Empregados - admissões - sem ajuste - novo Caged
6909 CAGED12_ADMISNAJU12 Empregados - admissões - com ajuste - novo Caged
6910 CAGED12_DESLIG Empregados - demissões - INATIVA
6911 CAGED12_DESLIGN12 Empregados - demissões - sem ajuste - novo Caged
6912 CAGED12_DESLIGNAJU12 Empregados - demissões - com ajuste - novo Caged
6913 CAGED12_SALDO12 Empregados - saldo - INATIVA
6914 CAGED12_SALDON12 Empregados - saldo - sem ajuste - novo Caged
6915 CAGED12_SALDONAJU12 Empregados - saldo - com ajuste - novo Caged
ipea.describe('CAGED12_SALDON12')
Empregados - saldo - sem ajuste - novo Caged
Name Empregados - saldo - sem ajuste - novo Caged
Code CAGED12_SALDON12
Big Theme Macroeconômico
Theme code 12
Source Ministério da Economia, Secretaria Especial de...
Source acronym Min. Economia/SEPRT/Novo Caged
Comment Para empregados consideram-se aqueles contrata...
Last update 2024-05-29T17:28:01.243-03:00
Frequency Mensal
Measure Pessoa
Unit None
Status A
Passo 2: aponte na função timeseries() o código da séries de interesse:
Dessa forma simples se tem acesso rápido e fácil a diversas séries. Importante consultar os detalhes dos argumentos na documentação da biblioteca e, sobre as séries, pela função metadata() ou no site da instituição.
No caso dos dados do SIDRA, o mais fácil é consultar no SIDRA, obter o link e importar com o pandas.
A biblioteca oferece uma única função, get_table(), que permite, através de seus argumentos, específicar a série e seus parâmetros para a importação.
Os diferente tipos de parâmetros definem a tabela e suas dimensões (períodos, variáveis, unidades territorias e classificações/categorias). Iremos elencar a baixo cada parâmetro, como obter e onde se insere na função (para mais observações ver a página de ajuda da API do SIDRA).
t (table_code) - é o código da tabela referente ao indicador e a pesquisa;
p (period) - utilizado para específicar o período;
v (variable) - para específicar as variáveis desejadas;
n (territorial_level) - especifica os níveis territoriais;
n/ (ibge_territorial_code) - inserido dentro do nível terrorial, especificar o código territorial do IBGE;
c/ (classification/categories) - especifica as classificações da tabela e suas respectivas categorias.
Para obter a tabela e os códigos, o primeiro passo será entrar na interface do SIDRA e buscar a pesquisa/indicador de interesse através do site e em seu buscador https://sidra.ibge.gov.br/home/
Passo 1: localize no site https://sidra.ibge.gov.br/ a tabela de interesse e aplique os filtros desejados (neste caso marcamos “Variável” = “’Area Colhida”; “Produto das lavouras temporárias e permanentes” = “Manga”; “Ano” = 2003 a 2022 e “Unidade Territorial” = “Sao Francisco Pernambucano e Vale Sao Franciscano da Bahia”);
Passo 2: clique no botão de compartilhar, na parte inferior, chamado “Links de compartilhar” e no primeiro campo na tela que se abre, “Parâmetros para a API”, copie o link que aparece;
Passo 3: utilize a função read_json() do pandas para importar os dados, adicionando ao final do link esta opção “?formato=json”.
Dessa forma simples conseguimos acesso rápido e fácil aos dados de qualquer tabela do Sidra. Consulte os detalhes e mais opções na documentação das bibliotecas e, sobre as tabelas, no site da instituição.
# Importar tabela 5457 do Sidra/IBGEimport pandas as pddados_sidra = pd.read_json( path_or_buf ="https://apisidra.ibge.gov.br/values/t/5457/n8/2602,2902/v/216/p/last%2020/c782/0?formato=json" )dados_sidra.tail()
NC NN MC MN ... D3C D3N D4C D4N
36 8 Mesorregião Geográfica 1006 Hectares ... 2018 2018 0 Total
37 8 Mesorregião Geográfica 1006 Hectares ... 2019 2019 0 Total
38 8 Mesorregião Geográfica 1006 Hectares ... 2020 2020 0 Total
39 8 Mesorregião Geográfica 1006 Hectares ... 2021 2021 0 Total
40 8 Mesorregião Geográfica 1006 Hectares ... 2022 2022 0 Total
[5 rows x 13 columns]
Outro Exemplo
Usada a série do PIB sem ajuste sazonal e com ajuste sazonal, referente a tabela 1620 e 1621, respectivamente, que se trata da série das Contas Nacionais Trimestrais.
t (table_code) = 1620
n (territorial_level) = 1
n/ (ibge_territorial_code) = all
v (variable) = all
p (period) = all
c/ (categories) = 11255/90707
# Importa as bibliotecas necessáriasimport sidrapyimport numpy as npimport pandas as pdimport datetime as dtimport seaborn as snsimport matplotlib.pyplot as plt# Importa os dados do SIDRApib_sa_raw = sidrapy.get_table(table_code="1620", territorial_level ="1", ibge_territorial_code ="all", period ="all", classification ="11255/90707")pib_sa_raw.head()
NC ... D4N
0 Nível Territorial (Código) ... Variável
1 1 ... Série encadeada do índice de volume trimestral...
2 1 ... Série encadeada do índice de volume trimestral...
3 1 ... Série encadeada do índice de volume trimestral...
4 1 ... Série encadeada do índice de volume trimestral...
[5 rows x 13 columns]
# Substitui as colunas pela primeira observaçãopib_sa_raw.columns = pib_sa_raw.iloc[0]# Retira a primeira observaçãopib_sa_raw = pib_sa_raw.iloc[1:, :]# Altera para float a coluna do valorpib_sa_raw['Valor'] = pib_sa_raw['Valor'].astype(float)pib_sa_raw.head()
0 Nível Territorial (Código) ... Variável
1 1 ... Série encadeada do índice de volume trimestral...
2 1 ... Série encadeada do índice de volume trimestral...
3 1 ... Série encadeada do índice de volume trimestral...
4 1 ... Série encadeada do índice de volume trimestral...
5 1 ... Série encadeada do índice de volume trimestral...
[5 rows x 13 columns]
# Renomeia e seleciona as colunas de interessepib_sa = pib_sa_raw.rename(columns = {"Valor" : "pib_sa","Trimestre (Código)" : "date"})[['pib_sa', 'date']]pib_sa
# Lidar com a coluna de trimestre para transformar em datapib_sa['date'] = pib_sa['date'].str[:-2] + pib_sa['date'].str[-2:].replace({"01" : "03","02" : "06","03" : "09","04" : "12"})pib_sa
# Transforma em formato date a coluna de data e insere no índicepib_sa.index = pd.to_datetime(pib_sa['date'],format="%Y%m")# Retira a coluna de datapib_sa = pib_sa.drop(columns = ['date'])pib_sa
# Importa os dados do pib com ajuste sazonalpib_raw = sidrapy.get_table(table_code="1621", territorial_level ="1", ibge_territorial_code="all", period ="all", classification ="11255/90707")pib_raw.head()
NC ... D4N
0 Nível Territorial (Código) ... Variável
1 1 ... Série encadeada do índice de volume trimestral...
2 1 ... Série encadeada do índice de volume trimestral...
3 1 ... Série encadeada do índice de volume trimestral...
4 1 ... Série encadeada do índice de volume trimestral...
[5 rows x 13 columns]
# Substitui as colunas pela primeira observaçãopib_raw.columns = pib_raw.iloc[0]# Retira a primeira observaçãopib_raw = pib_raw.iloc[1:, :]# Altera para float a coluna do valorpib_raw['Valor'] = pib_raw['Valor'].astype(float)# Renomeia e seleciona as colunaspib = pib_raw.rename(columns = {"Valor" : "pib","Trimestre (Código)" : "date"})[['pib', 'date']]# Procedimento para lidar com a coluna de trimestre para transformar em datapib['date'] = pib['date'].str[:-2] + pib['date'].str[-2:].replace({"01" : "03","02" : "06","03" : "09","04" : "12"})# Transforma em formato date a coluna de data e insere no índicepib.index = pd.to_datetime(pib['date'],format="%Y%m")# Retira a coluna de datapib = pib.drop(columns = ['date'])pib
# Transforma o data frame de wide para longpib_df_long = pd.melt(pib_df.reset_index(), id_vars ='date', value_vars = ['pib', 'pib_sa'], var_name ='variable', value_name ='values')
# Configura o tema do gráficotheme = {'figure.figsize' : (15, 10),'axes.facecolor' : 'white',"axes.spines.right": False,"axes.spines.top": False}# Cor das variáveiscolors = ['#282f6b', '#b22200']# Adiciona as configuraçõessns.set_theme(style ='white', palette = colors, rc = theme)# Plotasns.lineplot(x ='date', y ='values', data = pib_df_long, hue ='variable', linewidth =2).set(xlabel ="", ylabel ="Número Índice", title ="Produto Interno Bruto - Índice (Base 1995 = 100)")# Adiciona a fonte no gráfico plt.annotate('Fonte: Sidra/IBGE', xy = (1.0, -0.06), xycoords='axes fraction', ha='right', va="center", fontsize=10)
Introdução ao NumPy
O NumPy, abreviatura de Numerical Python, é a biblioteca básica mais importante para o uso da análise de dados com Python. Os recursos do uso desse pacote permitem ao usuário realizar operações matemáticas, manipulação de vetores e dados entre outras diversas funcionalidade. Abaixo são mostrados os pontos básicos mais importante do NumPy.
Entre os principais recursos que pode se encontrar com NumPy, estão:
ndarray: um vetor multidimensional, que oferece operações aritméticas rápidas;
funções matemáticas para operações com vetores;
alinhamento e manipulação de dados.
ndarray
o objeto ndarray é uma classe de objeto no Python que permite a utilização de conjunto de dados como um vetor ou um conjunto de vetores, ou seja, permite realizar operações matemáticas e estatísticas, bem como também é possível manejar os dados de forma mais facilitada.
Um exemplo de calculo que pode-se utilizar é multiplicar um número inteiro com um vetor de dados. Assim como na matemática, o valor escalar repete a operação em todos os valores do vetores (algo que não ocorre sem o NumPy sem definir uma operação de fluxo com for), isto é chamado de vetorização.
import numpy as npdata = np.random.randn(2, 3)data
Para controlar o array, um modo simples de criar um vetor ordenado é utilizar arange. Para fatiar os valores, utiliza-se o colchete define o fatiamento conforme a coodernada do valor dentro do array.